﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xunit;
using M3G;
using System.Drawing;


namespace MyTestProject {

    public class TestImage2D {

        /**
         * コンストラクターのテスト1
         * 白紙の画像
         * */
        [Fact]
        public void TestConstructor1 () {
            var img = new Image2D (Image2D.RGBA, 64, 64);

            Assert.Equal (Image2D.RGBA, img.Format);
            Assert.Equal (64, img.Width);
            Assert.Equal (64, img.Height);
            Assert.Equal (true, img.Mutable);
            Assert.Equal (true, img.MipmapGenerateEnabled);
            Assert.Equal (true, img.Mipmapped);

            img.Save ("TestImage2D-Constructor1.png");
        }

        /**
         * コンストラクターのテスト2
         * 指定の画像データから
         * */
        [Fact]
        public void TestConstructor2 () {
            var bitmap = new Bitmap ("DragonYear.png");
            var pixels = Image2D.ConvertToPixels (Image2D.RGB, bitmap);
            var img    = new Image2D (Image2D.RGB, bitmap.Width, bitmap.Height, pixels);

            Assert.Equal (Image2D.RGB, img.Format);
            Assert.Equal (512, img.Width);
            Assert.Equal (512, img.Height);
            Assert.Equal (false, img.Mutable);
            Assert.Equal (true, img.MipmapGenerateEnabled);
            Assert.Equal (true, img.Mipmapped);

            img.Save ("TestImage2D-Constructor2.png");
        }

        /**
         * コンストラクターのテスト3
         * .NetのBitmapオブジェクトから
         * */
        [Fact]
        public void TestConstructor3 () {
            var bitmap = new Bitmap ("DragonYear.png");
            var img    = new Image2D (Image2D.Luminance, bitmap);

            Assert.Equal (Image2D.Luminance, img.Format);
            Assert.Equal (512, img.Width);
            Assert.Equal (512, img.Height);
            Assert.Equal (false, img.Mutable);
            Assert.Equal (true, img.MipmapGenerateEnabled);
            Assert.Equal (true, img.Mipmapped);

            img.Save ("TestImage2D-Constructor3.png");
        }


        /**
         * 画像の書き換えのテスト
         * ベースレベルの書き換え（とミップマップの自動作成）
         * */
        [Fact]
        public void TestSet1 () {
            var img    = new Image2D (Image2D.RGB, 512, 512);
            var bitmap = new Bitmap ("Girl-12.png");

            var pixels = Image2D.ConvertToPixels (Image2D.RGB, bitmap);
            img.Set (128, 128, 256, 256, pixels);

            img.Save ("TestImage2D-Set1.png");
        }


        /**
         * 画像の書き換えのテスト
         * ミップマップ階層の明示的な書き換え
         * */
        [Fact]
        public void TestSet2 () {
            var img           = new Image2D (Image2D.RGB, 512, 512);
            var pixels256x256 = Image2D.ConvertToPixels (Image2D.RGB, new Bitmap ("Girl-12.png"));
            var pixels128x128 = Image2D.ConvertToPixels (Image2D.RGB, new Bitmap ("Girl-15.png"));

            img.MipmapGenerateEnabled = false;

            // ベース画像        : 512x512
            // ミップマップ階層1 : 256x256
            // ミップマップ階層2 : 128x128

            img.Set (1, 0, 0, 256, 256, pixels256x256);
            img.Set (2, 0, 0, 128, 128, pixels128x128);

            img.Save ("TestImage2D-Set2.png");
        }

        /**
         * 画像の書き換えのテスト
         * Bitmapオブジェクトを直に使った書き換え
         * */
        [Fact]
        public void TestSet3 () {
            var img    = new Image2D (Image2D.RGB, 512, 512);
            var bitmap = new Bitmap ("Girl-6.png");

            img.Set (0, 0, 0, 0, 0, 512, 512, bitmap);
            img.Set (0, 256, 0, 128, 128, 256, 256, bitmap);

            img.Save ("TestImage2D-Set3.png");
        }


        /**
         * 複製のテスト
         * */
        [Fact]
        public void TestDuplicate () {
            var img     = new Image2D (Image2D.RGB, 256, 256);
            var bitmap1 = new Bitmap ("Girl-12.png");
            img.Set (0, 0, 0, 0, 0, bitmap1.Width, bitmap1.Height, bitmap1);
            img.UserID = 100;
            
            var dup = (Image2D)img.Duplicate ();
            img.Save ("TestImage2D-Duplicate-1.png");
            dup.Save ("TestImage2D-Duplicate-2.png");
            
            var bitmap2 = new Bitmap ("Girl-18.png");
            dup.Set (0, 0, 0, 0, 0, bitmap2.Width, bitmap2.Height, bitmap2);

            // 複製元と複製先でバッファーを共有してはならない
            // 1,2,3が12才で4だけ18才
            img.Save ("TestImage2D-Duplicate-3.png");
            dup.Save ("TestImage2D-Duplicate-4.png");

            Assert.Equal (img.Format, dup.Format);
            Assert.Equal (img.Width, dup.Width);
            Assert.Equal (img.Height, dup.Height);
            Assert.Equal (img.Mutable, dup.Mutable);
            Assert.Equal (img.Mipmapped, dup.Mipmapped);
            Assert.Equal (img.UserID, dup.UserID);

        }
    }

}
